#include "wxsstoringsplitterwindow.h"

#include <wx/sizer.h>


#define MIN_MARGIN  20

#include <manager.h>
#include <logmanager.h>
#include <configmanager.h>

static const wxWindowID SplitterId = wxNewId();

wxsStoringSplitterWindow::wxsStoringSplitterWindow( wxWindow* Parent ): wxPanel( Parent ) {
  wxBoxSizer* Sizer = new wxBoxSizer( wxVERTICAL );
  Sizer->Add( Splitter = new wxSplitterWindow( this, SplitterId ), 1, wxGROW | wxALL );
  SetSizer( Sizer );
  SplitPosition = Manager::Get()->GetConfigManager( _T( "wxsmith" ) )->ReadInt( _T( "/res_panel_split" ), -1 );
}

void wxsStoringSplitterWindow::Split( wxWindow* Top, wxWindow* Bottom, int SashPosition ) {
  if( Top ) {
    Top->SetParent( Splitter );
  }
  if( Bottom ) {
    Bottom->SetParent( Splitter );
  }
  if( SashPosition ) {
    SplitPosition = SashPosition;
  }
  Splitter->SplitHorizontally( Top, Bottom, SplitterFixup( SplitPosition ) );
}

void wxsStoringSplitterWindow::OnSize( wxSizeEvent& event ) {
  Splitter->SetSashPosition( SplitterFixup( SplitPosition ) );
  event.Skip();
}

void wxsStoringSplitterWindow::OnSplitterDClick( wxSplitterEvent& event ) {
  event.Veto();
}

void wxsStoringSplitterWindow::OnSplitterChanging( wxSplitterEvent& event ) {
  SplitPosition = event.GetSashPosition();
  event.SetSashPosition( SplitterFixup( SplitPosition ) );
}

void wxsStoringSplitterWindow::OnSplitterChanged( wxSplitterEvent& event ) {
  event.SetSashPosition( SplitterFixup( SplitPosition ) );
  Manager::Get()->GetConfigManager( _T( "wxsmith" ) )->Write( _T( "/res_panel_split" ), ( int )SplitPosition );
}

int wxsStoringSplitterWindow::SplitterFixup( int Position ) {
  int Height = GetSize().GetHeight();
  int MinMargin = Height / 2;
  if( Position < 0 || Position > Height ) {
    return Height / 2;
  }
  if( MinMargin > MIN_MARGIN ) {
    MinMargin = MIN_MARGIN;
  }
  if( Position < MinMargin ) {
    Position = MinMargin;
  }
  if( Position > Height - MinMargin ) {
    Position = Height - MinMargin;
  }
  return Position;
}

BEGIN_EVENT_TABLE( wxsStoringSplitterWindow, wxPanel )
  EVT_SIZE( wxsStoringSplitterWindow::OnSize )
  EVT_SPLITTER_DCLICK( SplitterId, wxsStoringSplitterWindow::OnSplitterDClick )
  EVT_SPLITTER_SASH_POS_CHANGING( SplitterId, wxsStoringSplitterWindow::OnSplitterChanging )
  EVT_SPLITTER_SASH_POS_CHANGED( SplitterId, wxsStoringSplitterWindow::OnSplitterChanged )
END_EVENT_TABLE()
